package interceptor

import (
	"context"

	"zerorpc/pkg/validatorx"

	"github.com/gogf/gf/v2/errors/gcode"
	"github.com/gogf/gf/v2/frame/g"
	"google.golang.org/grpc"
	"google.golang.org/grpc/codes"
	"google.golang.org/grpc/status"
)

// ValidatorInterceptor 在处理rpc请求前拦截请求并校验参数
func ValidatorInterceptor(ctx context.Context, req interface{}, info *grpc.UnaryServerInfo, handler grpc.UnaryHandler) (resp interface{}, err error) {
	if err = validatorx.Struct(req); err != nil {
		// 创建自定义错误类型
		//erx := gcode.New(gcode.CodeInvalidParameter.Code(), err.Error(), nil)
		// 转成grpc错误类型
		err = status.Error(codes.Code(gcode.CodeInvalidParameter.Code()), err.Error())
		return
	}
	resp, err = handler(ctx, req)
	return
}

// ValidatorInterceptorGf 在处理rpc请求前拦截请求并校验参数
func ValidatorInterceptorGf(ctx context.Context, req interface{}, info *grpc.UnaryServerInfo, handler grpc.UnaryHandler) (resp interface{}, err error) {
	// It does nothing if there's no validation tag in the struct definition.
	if err = g.Validator().Data(req).Run(ctx); err != nil {
		err = status.Error(codes.Code(gcode.CodeInvalidParameter.Code()), err.Error())
		return
	}

	resp, err = handler(ctx, req)
	return
}
